package com.atguigu.gmall.common.config;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @author Fxz
 * @version 1.0
 * @date 2022-02-20 16:37
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class MQProducerAckConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

	private final RabbitTemplate rabbitTemplate;

	/**
	 * 修饰一个非静态的void方法,在服务器加载servlet的时候运行,并且只会被服务器执行一次在构造函数之后执行,init方法之前执行
	 */
	@PostConstruct
	public void init() {
		rabbitTemplate.setConfirmCallback(this);
		rabbitTemplate.setReturnCallback(this);
	}

	/**
	 * 消息成功发送到交换机
	 * @param correlationData 数据载体带有id标识
	 * @param ack 是否成功发送到交换机
	 * @param cause 发送失败的原因
	 */
	@Override
	public void confirm(CorrelationData correlationData, boolean ack, String cause) {
		if (ack) {
			log.info("消息成功发送到交换机:{}", correlationData);
		}
		else {
			log.info("消息未成功发送到交换机:{}", cause);
		}
	}

	/**
	 * 消息没有发送到队列,则执行该方法
	 * @param message 消息主体
	 * @param replyCode 应答码
	 * @param replyText 描述
	 * @param exchange 交换机
	 * @param routingKey 路由键
	 */
	@Override
	public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
		log.info("消息主体:{}\n 应答码:{}\n 描述:{}\n 交换机:{}\n 路由键:{}", message, replyCode, replyText, exchange, routingKey);
	}

}
